package cn.iune.system.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.Map.Entry;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class AppSystemService {
	
	//服务器API地址
//	public static final String HTTP_URL = "http://localhost:8081/u2/api-auth";
	public static final String SERVER_URL = "server_url";
	public static final String NODE_TYPE = "node_type";

	
    
    static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    
//    char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
//            'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
//            'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    static int codeCount = 4;//定义图片上显示验证码的个数
	
	
	 
	// json 转 map  
    public static JSONObject mapToJson(Map<String,String> map) {  
        // 得到json  
       JSONObject json = new JSONObject();  
       // 使用谷歌的gson将json转换为map类型    TypeToken<Map<String, String>>()  此格式可以以自己的需求进行调整  
//       Map<String, String> mapData = gson.fromJson(json.toString(), new TypeToken<Map<String, String>>(){}.getType());  
       // 循环map  
       for (Entry<String, String> entry : map.entrySet()) {  
           System.out.print(entry.getKey() + ":" + entry.getValue() + "\n");  
       }  
       // System.out.println(mapData.toString());  
       return json;
    }  
	
	
	//生成验证码
	public static String createVcode() {  
		 
       // 创建一个随机数生成器类
       Random random = new Random();

       // randomCode用于保存随机产生的验证码，以便用户登录后进行验证。
       StringBuffer randomCode = new StringBuffer();

       // 随机产生codeCount数字的验证码。
       for (int i = 0; i < codeCount; i++) {
           // 得到随机产生的验证码数字。
           String code = String.valueOf(codeSequence[random.nextInt(36)]);

           // 将产生的四个随机数组合在一起。
           randomCode.append(code);
       }
       // 将四位数字的验证码保存到Session中。
//       HttpSession session = req.getSession();
       System.out.println("randomCode-->"+randomCode);
       
       return randomCode.toString();
    }  
	
	
	
	/**
    * 不够位数的在前面补0，保留num的长度位数字
    * @param code
    * @return
    */
	public static String autoGenericCode(String code, int num) {
       String result = "";
       // 保留num的位数
       // 0 代表前面补充0     
       // num 代表长度为4     
       // d 代表参数为正数型 
       result = String.format("%0" + num + "d", Integer.parseInt(code) + 1);

       return result;
   }
   


	/**
    * 根据JSONArray String获取到List
    * @param <T>
    * @param <T>
    * @param jArrayStr
    * @return
    */
   public static <T> List<T> getListByArray(Class<T> class1,String jArrayStr) {
       List<T> list = new ArrayList<>();
       JSONArray jsonArray = JSONArray.parseArray(jArrayStr);
       if (jsonArray==null || jsonArray.isEmpty()) {
           return list;//nerver return null
       }
       for (Object object : jsonArray) {
           JSONObject jsonObject = (JSONObject) object;
           T t = JSONObject.toJavaObject(jsonObject, class1);
           list.add(t);
       }
       return list;
   }

   /**
    * 根据List获取到对应的JSONArray
    * @param list
    * @return
    */
   public static JSONArray getJSONArrayByList(List<?> list){
       JSONArray jsonArray = new JSONArray();
       if (list==null ||list.isEmpty()) {
           return jsonArray;//nerver return null
       }

       for (Object object : list) {
           jsonArray.add(object);
       }
       return jsonArray;
   }    
   
   //将url参数转换为键值对对象
   public static JSONObject paramToJSONObject(String str){
		
		JSONObject json = new JSONObject();
		String[] arr1 = str.split("&");
		for(String s : arr1) {
			String[] arr2 = s.split("=");
			json.put(arr2[0], arr2[1]);
		}
		
       return json;
   }    
   
   
   //参数类型是Map<String,String> 因为支付只能用string的参数。如果诸君还需要修改的话，那也可以适当的做调整
 	/**
 	 *
 	 * map转str
 	 * @param map
 	 * @return
 	 */
 	public static String mapToString(Map<String,String> map){
 		Set<String> keySet = map.keySet();
 		//将set集合转换为数组
 		String[] keyArray = keySet.toArray(new String[keySet.size()]);
 		//给数组排序(升序)
 		Arrays.sort(keyArray);
 		//因为String拼接效率会很低的，所以转用StringBuilder。博主会在这篇博文发后不久，会更新一篇String与StringBuilder开发时的抉择的博文。
 		StringBuilder sb = new StringBuilder();
 		for (int i = 0; i < keyArray.length; i++) {
 			// 参数值为空，则不参与签名 这个方法trim()是去空格
 			if (map.get(keyArray[i]).trim().length() > 0) {
 				sb.append(keyArray[i]).append("=").append(map.get(keyArray[i]).trim());
 			}
 			if(i != keyArray.length-1){
 				sb.append("&");
 			}
 		}
 		return sb.toString();
 	}
 	/**
	 * 2018年10月24日更新
	 * String转map
	 * @param str
	 * @return
	 */
	public static Map<String,String> stringToMap(String str){
		//感谢bojueyou指出的问题
		//判断str是否有值
		if(null == str || "".equals(str)){
			return null;
		}
		//根据&截取
		String[] strings = str.split("&");
		//设置HashMap长度
		int mapLength = strings.length;
		//判断hashMap的长度是否是2的幂。
		if((strings.length % 2) != 0){
			mapLength = mapLength+1;
		}

		Map<String,String> map = new HashMap<>(mapLength);
		//循环加入map集合
		for (int i = 0; i < strings.length; i++) {
			//截取一组字符串
			String[] strArray = strings[i].split("=");
			//strArray[0]为KEY  strArray[1]为值
			map.put(strArray[0],strArray[1]);
		}
		return map;
	}
	
 	/*
	 --------------------- 
	 作者：哆啦A梦丶幻想 
	 来源：CSDN 
	 原文：https://blog.csdn.net/w2298119289j/article/details/81320061 
	 版权声明：本文为博主原创文章，转载请附上博文链接！
	*/
	
	//读取文件
	public static String readFile(String Path) {
		BufferedReader reader = null;
		String laststr = "";
		try {
			FileInputStream fileInputStream = new FileInputStream(Path);
			InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
			reader = new BufferedReader(inputStreamReader);
			String tempString = null;
			while ((tempString = reader.readLine()) != null) {
				laststr += tempString;
			}
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return laststr;
	}


	//封面（单图）
	public static String transformPic(String imageurl, String ossServer){
		JSONArray arrayImageurl = new JSONArray();
		if(imageurl!=null) {
			//单图
			//http://www.iune.cn/group1/M00/00/00/cxzWEVq2MjCAc8JsAAAuxlb_9jI617.jpg
			//String ossServer = appConfigParams.getOssServer();//"http://www.iune.cn";
			arrayImageurl = JSONArray.parseArray(imageurl);
			//[{"remoteFileName":"M00/00/01/cxzWEVuxsaGAGM53AABkeWyTCEw855.jpg","groupName":"group1","originalFilename":"131097612878657419_wmk.jpg"},{"remoteFileName":"M00/00/01/cxzWEVtZ24yAMd2MAACxW7HAcco856.jpg","groupName":"group1","originalFilename":"589d3de5N48cfbe46.jpg"},{"remoteFileName":"M00/00/01/cxzWEVtZVsKAEKl3AAAcaGOOVFo105.jpg","groupName":"group1","originalFilename":"ljdxm.jpg"},{"remoteFileName":"M00/00/00/cxzWEVtVQp-AMgkoAAAVTb55arQ384.png","groupName":"group1","originalFilename":"Untitled.png"}]
			JSONObject jsonObject = arrayImageurl.getJSONObject(0);
			String groupName = jsonObject.getString("groupName");
			String remoteFileName = jsonObject.getString("remoteFileName");
			String url = ossServer + "/" + groupName + "/" + remoteFileName;
			return url;
		}
		return null;
	}

	//封面（单图）
	public static JSONArray transformPics(String images, String ossServer, String goodsId){
		
		JSONArray pics = new JSONArray();
		JSONArray arrayImages = new JSONArray();
		if(images!=null) {
			//图集（多图片）
			//http://www.iune.cn/group1/M00/00/00/cxzWEVq2MjCAc8JsAAAuxlb_9jI617.jpg
			//String ossServer = appConfigParams.getOssServer();//"http://www.iune.cn";
			arrayImages = JSONArray.parseArray(images);
			//[{"remoteFileName":"M00/00/01/cxzWEVuxsaGAGM53AABkeWyTCEw855.jpg","groupName":"group1","originalFilename":"131097612878657419_wmk.jpg"},{"remoteFileName":"M00/00/01/cxzWEVtZ24yAMd2MAACxW7HAcco856.jpg","groupName":"group1","originalFilename":"589d3de5N48cfbe46.jpg"},{"remoteFileName":"M00/00/01/cxzWEVtZVsKAEKl3AAAcaGOOVFo105.jpg","groupName":"group1","originalFilename":"ljdxm.jpg"},{"remoteFileName":"M00/00/00/cxzWEVtVQp-AMgkoAAAVTb55arQ384.png","groupName":"group1","originalFilename":"Untitled.png"}]
			for(Object obj : arrayImages) {
				JSONObject jsonObject = (JSONObject) obj;
				String groupName = jsonObject.getString("groupName");
				String remoteFileName = jsonObject.getString("remoteFileName");
				String url = ossServer + "/" + groupName + "/" + remoteFileName;

				JSONObject jsonPic = new JSONObject();
				jsonPic.put("goodsId", goodsId);
				jsonPic.put("pic", url);
				pics.add(jsonPic);
			}
			return pics;
		}
		return null;
	}
	
	//java遍历实体类的属性和值
	public static void reflect(Class<?> e) throws Exception{  
        Class cls = e.getClass();  
        Field[] fields = cls.getDeclaredFields();  
        for(int i=0; i<fields.length; i++){  
            Field f = fields[i];  
            f.setAccessible(true);  
            System.out.println("属性名:" + f.getName() + " 属性值:" + f.get(e));  
        }   
    } 

}
